<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>call、apply</title>
</head>

<body>

</body>
<script>
  /*
   * apply() call()
   * 每个函数都包含两个非继承而来的方法
  */

  /* window.color = 'red';
  var obj = { color: 'blue' };

  function sayColor(){
    console.log(this.color);
  }

  sayColor(); // red 因为当前this指向了window
  sayColor.call(this);  //red 
  sayColor.call(window);  //red
  sayColor.call(obj);  //blue */


  // 在非严格模式下，如果我们使用call()或者apply()方法，传入一个null或者undefined会被转换成一个全局的window对象
  // 在严格模式下，函数的指向始终都是指定的值
  /* var color = 'red';
  function displayColor() {
    console.log(this) // window
    console.log(this.color);
  }
  displayColor.call(null);

  function displayColor() {
    'use strict';
    console.log(this)  // null
    console.log(this.color);
  }
  displayColor.call(null); */


  // 闭包
  // function foo() {
  //   var arr = [];
  //   for (var i = 0; i < 10; i++) {
  //     (
  //       function(n){
  //         arr[n] = function(){
  //           return n
  //         }
  //       }
  //     )(i)
  //   }
  //   return arr;
  // }
  // var bar = foo();
  // console.log(bar[1]());
  // console.log(bar[2]());
  // console.log(bar[3]());

  var d = 1;
  function d(d) {
    console.log(d);
    var d = 3;
  }
  d(2);

  var d;
  function d(d) {
    console.log(d);
    var d = 3;
  }
  d = 1;
  d(2)





</script>

</html>